<?php

require_once('fpdf.php');

class PDF extends FPDF {
    /*     * *************************
     *        Document
     * ************************* */

    function AjouterTitre($titre) {
        $titre = utf8_decode($titre);
        $this->SetFont(POLICE, '', 16);
        $this->Cell(0, 10, $titre . " (" . $this->PageNo() . '/{nb}' . ")", 1, 1, 'C');
        $this->line(10, 20, 200, 20);
    }

    function AjouterPartieLibre($html) {

        $html = utf8_decode($html);
        $html = (nl2br($html));
        $html = str_replace('<br/>', '<br>', $html);
        $yo = $this->GetY();
        //$this->MultiCell(0, 10, $html, "LR", 1);
        $this->SetFont(POLICE, '', 11);
        $this->WriteHTML($html);
        $y = $this->GetY();
        //Ligne verticale gauche
        $this->Line(10, $yo, 10, $y);
        //Ligne verticale droite
        $this->Line(200, $yo, 200, $y);

        $this->line(10, $y, 200, $y);
    }

    function AjouterDimension(Dimension2 $dimension) {
        $yo = $this->GetY();
        $titre = $dimension->getDimension1()->getRefD1() . "." . $dimension->getDimension2() . " " . $dimension->getTitre();
        $this->AjouterTitreDimension($titre);
        $this->SetFont(POLICE, "");
        $this->MultiCell(0, 5, $dimension->getDescr(), "LR", 1);
        $this->AjouterNiveauDimension($dimension->getLesDimensions3());
        $lesConnaissances = array();
        $lesSavoirFaire = array();
        foreach ($dimension->getLesDimensions4() as $ligne) {
            if ($ligne->getType()->getLettre() == "K") {
                $lesConnaissances[] = $ligne;
            } else {
                $lesSavoirFaire[] = $ligne;
            }
        }
        if (count($lesConnaissances) > 0) {
            $this->AjouterConnaissanceDimension($dimension->getLesDimensions4());
        }
        if(count($lesSavoirFaire)>0) {
        $this->AjouterSavoirFaireDimension($dimension->getLesDimensions4());
        }
        $y = $this->GetY();


        $this->line(10, $y, 200, $y);
        /* $this->MultiCell(0, 5, $dimension->getToto()."\n"."fg",1);
          $this->Cell(1, 5, $dimension->getTiti()->getTitre()); */
    }

    private function AjouterTitreDimension($titreDimension) {
        $titreDimension = $titreDimension;
        $this->SetFont(POLICE, "B");
        $this->Cell(0, 5, $titreDimension, "LR", true, "L");
    }

    private function AjouterNiveauDimension($lesNiveaux) {

        foreach ($lesNiveaux as $niveau) {
            $titre = "Niveau " . $niveau->getNiveau();
            $descr = $niveau->getDescr();
            $this->SetFont(POLICE, "B");
            $this->Cell(0, 7, $titre, "LR", true, "L");
            $this->SetFont(POLICE, "");
            $this->MultiCell(0, 5, $descr, "LR", "L");
        }
    }

    private function AjouterConnaissanceDimension($lesConnaissances) {
        $this->SetFont(POLICE, "B");
        $this->Cell(0, 7, "Connaissances", "LR", true, "L");
        foreach ($lesConnaissances as $connaissance) {
            if ($connaissance->getType()->getLettre() == "K") {
                $this->SetFont(POLICE, "");
                $toPrint = "K" . $connaissance->getChiffre() . " " . $connaissance->getDescr();
                $this->MultiCell(0, 5, "     " . chr(149) . " " . $toPrint, "LR", "L");
            }
        }
    }

    private function AjouterSavoirFaireDimension($lesConnaissances) {
        $this->SetFont(POLICE, "B");
        $this->Cell(0, 7, "Savoir-faire", "LR", true, "L");
        foreach ($lesConnaissances as $sf) {
            if ($sf->getType()->getLettre() == "S") {
                $this->SetFont(POLICE, "");
                $toPrint = "S" . $sf->getChiffre() . " " . $sf->getDescr();
                $this->MultiCell(0, 5, "     " . chr(149) . " " . $toPrint, "LR", "L");
            }
        }
    }

    //MultiCell with bullet
    function MultiCellBlt($w, $h, $blt, $txt, $border=0, $align='J', $fill=false) {
        //Get bullet width including margins
        $blt_width = $this->GetStringWidth($blt) + $this->cMargin * 2;

        //Save x
        $bak_x = $this->x;

        //Output bullet
        $this->Cell($blt_width, $h, $blt, 0, '', $fill);

        //Output text
        $this->MultiCell($w - $blt_width, $h, $txt, $border, $align, $fill);

        //Restore x
        $this->x = $bak_x;
    }

    /*     * ************************
     *           HTML
     */

    //variables du parseur html
    var $B = 0;
    var $I = 0;
    var $U = 0;
    var $HREF = "";
    var $fontList = array('arial', 'times', 'courier', 'helvetica', 'symbol');
    var $issetfont = false;
    var $issetcolor = false;

    function WriteHTML($html) {
        $html = $html . "<br>";
        //Parseur HTML
        $html = strip_tags($html, "<b><u><i><a><img><p><br><strong><em><font><tr><blockquote>"); //supprime tous les tags sauf ceux reconnus
        $html = str_replace("\n", ' ', $html); //remplace retour à la ligne par un espace
        $a = preg_split('/<(.*)>/U', $html, -1, PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
        foreach ($a as $i => $e) {
            if ($i % 2 == 0) {
                //Texte
                if ($this->HREF)
                    $this->PutLink($this->HREF, $e);
                else
                    $this->Write(5, stripslashes(txtentities($e)));
            }
            else {
                //Balise
                if ($e[0] == '/')
                    $this->CloseTag(strtoupper(substr($e, 1)));
                else {
                    //Extraction des attributs
                    $a2 = explode(' ', $e);
                    $tag = strtoupper(array_shift($a2));
                    $attr = array();
                    foreach ($a2 as $v) {
                        if (preg_match('/([^=]*)=["\']?([^"\']*)/', $v, $a3))
                            $attr[strtoupper($a3[1])] = $a3[2];
                    }
                    $this->OpenTag($tag, $attr);
                }
            }
        }
    }

    function OpenTag($tag, $attr) {
        //Balise ouvrante
        switch ($tag) {
            case 'STRONG':
                $this->SetStyle('B', true);
                break;
            case 'EM':
                $this->SetStyle('I', true);
                break;
            case 'B':
            case 'I':
            case 'U':
                $this->SetStyle($tag, true);
                break;
            case 'A':
                $this->HREF = $attr['HREF'];
                break;
            case 'IMG':
                if (isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
                    if (!isset($attr['WIDTH']))
                        $attr['WIDTH'] = 0;
                    if (!isset($attr['HEIGHT']))
                        $attr['HEIGHT'] = 0;
                    $this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
                }
                break;
            case 'TR':
            case 'BLOCKQUOTE':
            case 'BR':
                $this->Ln(5);
                break;
            case 'P':
                $this->Ln(10);
                break;
            case 'FONT':
                if (isset($attr['COLOR']) && $attr['COLOR'] != '') {
                    $coul = hex2dec($attr['COLOR']);
                    $this->SetTextColor($coul['R'], $coul['V'], $coul['B']);
                    $this->issetcolor = true;
                }
                if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
                    $this->SetFont(strtolower($attr['FACE']));
                    $this->issetfont = true;
                }
                break;
        }
    }

    function CloseTag($tag) {
        //Balise fermante
        if ($tag == 'STRONG')
            $tag = 'B';
        if ($tag == 'EM')
            $tag = 'I';
        if ($tag == 'B' || $tag == 'I' || $tag == 'U')
            $this->SetStyle($tag, false);
        if ($tag == 'A')
            $this->HREF = '';
        if ($tag == 'FONT') {
            if ($this->issetcolor == true) {
                $this->SetTextColor(0);
            }
            if ($this->issetfont) {
                $this->SetFont('arial');
                $this->issetfont = false;
            }
        }
    }

    function SetStyle($tag, $enable) {
        //Modifie le style et sélectionne la police correspondante
        $this->$tag+=($enable ? 1 : -1);
        $style = '';
        foreach (array('B', 'I', 'U') as $s) {
            if ($this->$s > 0)
                $style.=$s;
        }
        $this->SetFont('', $style);
    }

    function PutLink($URL, $txt) {
        //Place un hyperlien
        $this->SetTextColor(0, 0, 255);
        $this->SetStyle('U', true);
        $this->Write(5, $txt, $URL);
        $this->SetStyle('U', false);

        $this->SetTextColor(0);
    }

    function Footer() {
        // Positionnement à 1,5 cm du bas
        $this->SetY(-15);
        // Police Arial italique 8
        $this->SetFont('Arial', 'I', 8);
        // Numéro de page centré
        $this->Cell(0, 10, 'Page ' . $this->PageNo(), 0, 0, 'C');
    }

}

function hex2dec($couleur = "#000000") {
    $R = substr($couleur, 1, 2);
    $rouge = hexdec($R);
    $V = substr($couleur, 3, 2);
    $vert = hexdec($V);
    $B = substr($couleur, 5, 2);
    $bleu = hexdec($B);
    $tbl_couleur = array();
    $tbl_couleur['R'] = $rouge;
    $tbl_couleur['V'] = $vert;
    $tbl_couleur['B'] = $bleu;
    return $tbl_couleur;
}

//conversion pixel -> millimètre en 72 dpi
function px2mm($px) {
    return $px * 25.4 / 72;
}

function txtentities($html) {
    $trans = get_html_translation_table(HTML_ENTITIES);
    $trans = array_flip($trans);
    return strtr($html, $trans);
}

?>